#include "colors.hpp"
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

double calculDeltaS(int v)
{
	return ((double)1/v)*7650;
}

bool Colors::comparaison(int vb,int sb,int hb,int ecart,bool noir)
{
	if(noir==true)//cas des image en noir et blanc
	{
		if(v-vb<10 && v-vb>-10)//on compare seulement la value
		{
			return true;
		}
	}
	else 
	{
		if(v-vb<30 &&v-vb>-30)
		{
			if(s-sb<calculDeltaS(v) && s-sb>-calculDeltaS(v))
			{
				if(h-hb<sqrt((double)(255-v)*(255-v)+(255-s)*(255-s)) && h-hb>-sqrt((double)(255-v)*(255-v)+(255-s)*(255-s)))
				{
					return true;
				}
			}
		}
		/*if(v<30 && vb<30)
		{
			if(h-hb<ecart && h-hb>-ecart)
			{
				return true;
			}
		}
		else if(s<5 && sb<5)
		{
			if(v-vb<10 && v-vb>-10)
			{
				if(h-hb<ecart/3 && h-hb>-ecart/3)
				{
					return true;
				}
			}
		}
		else if(h-hb<ecart && h-hb>-ecart && s-sb<50 && s-sb>-50 && v-vb<50 && v-vb>-50)
		{
			return true;
		}*/
	}
	return false;
}

bool Colors::comparaison(Colors c, int ecart,bool noir)
{
	if(noir==true)//cas des image en noir et blanc
	{
		if(v-c.v<40 && v-c.v>-40)//on compare seulement la value
		{
			return true;
		}
	}
	else 
	{
		if(v-c.v<30 &&v-c.v>-30)
		{
			if(s-c.s<calculDeltaS(v) && s-c.s>-calculDeltaS(v))
			{
				if(h-c.h<sqrt((double)(255-v)*(255-v)+(255-s)*(255-s)) && h-c.h>-sqrt((double)(255-v)*(255-v)+(255-s)*(255-s)))
				{
					return true;
				}
			}
		}
		/*if(v<30 && c.v<30)
		{
			if(h-c.h<ecart && h-c.h>-ecart)
			{
				return true;
			}
		}
		else if(s<5 && c.s<5)
		{
			if(v-c.v<10 && v-c.v>-10)
			{
				if(h-c.h<ecart/3 && h-c.h>-ecart/3)
				{
					return true;
				}
			}
		}
		else if(h-c.h<ecart && h-c.h>-ecart && s-c.s<40 && s-c.s>-40 && v-c.v<50 && v-c.v>-50)
		{
			return true;
		}*/
	}
	return false;
}
int Colors::getV() const
{
	return v;
}
int Colors::getS() const
{
	return s;
}
int Colors::getH() const
{
	return h;
}
void Colors::setV(int vb)
{
	v=vb;
}
void Colors::setS(int sb)
{
	s=sb;
}
void Colors::setH(int hb)
{
	h=hb;
}
int Colors::getVR() const
{
	return vr;
}
int Colors::getSR() const
{
	return sr;
}
int Colors::getHR() const
{
	return hr;
}
void Colors::setVR(int vb)
{
	vr=vb;
}
void Colors::setSR(int sb)
{
	sr=sb;
}
void Colors::setHR(int hb)
{
	hr=hb;
}
void Colors::setColors(Colors c)
{
	h=c.h;
	s=c.s;
	v=c.v;
	hr=c.hr;
	sr=c.sr;
	vr=c.vr;
}
void Colors::moyenne(int vb,int sb,int hb)
{
	v=(v*nb+vb)/(nb+1);
	s=(s*nb+sb)/(nb+1);
	h=(h*nb+hb)/(nb+1);
	nb++;
}
void Colors::moyenne(Colors c)
{
	v=(v*nb+c.v*c.nb)/(nb+c.nb);
	s=(s*nb+c.s*c.nb)/(nb+c.nb);
	h=(h*nb+c.h*c.nb)/(nb+c.nb);
	nb+=c.nb;
	c.nb=nb;
}
